package com.cxm.report.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * @author scl.BlueOcean
 * @version 1.0
 * @date 2018年07月05 15:47
 * @description
 */
public class DateUtil {
    private static DateFormat defaultFormat = new SimpleDateFormat("yyyy-MM-dd");

    public static DateFormat getDefaultFormat() {
        return defaultFormat;
    }

    public static long compare(String start, Date end, DateFormat dateFormat) {
        if (dateFormat == null) {
            dateFormat = defaultFormat;
        }
        try {
            return dateFormat.parse(start).getTime() - dateFormat.parse(dateFormat.format(end)).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;

    }

    public static long compare(String start, String end) {
        return compare(start, detaultParse(end));
    }

    public static long compare(String start, Date end) {
        return compare(start, end, null);
    }

    public static String detaultFormat(Date date) {
        return defaultFormat.format(date);
    }

    public static Date detaultParse(String date) {
        try {
            return defaultFormat.parse(date);
        } catch (ParseException e) {
        }
        return null;
    }

    public static String[] getWeekScope(String date) {
        String[] scope = new String[2];
        Calendar cal = Calendar.getInstance();
        Date time = detaultParse(date);
        cal.setTime(time);
        //判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会出问题，计算到下一周去了
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);//获得当前日期是一个星期的第几天
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        cal.setFirstDayOfWeek(Calendar.MONDAY);//设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一

        int day = cal.get(Calendar.DAY_OF_WEEK);//获得当前日期是一个星期的第几天
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);//根据日历的规则，给当前日期减去星期几与一个星期第一天的差值
        scope[0] = detaultFormat(cal.getTime());
        cal.add(Calendar.DATE, 6);
        scope[1] = detaultFormat(cal.getTime());
        return scope;
    }

    public static String currentDay() {
        return detaultFormat(new Date());
    }

    public static Date getFuture(Date date, int interval, int unit) {
        Calendar calendar = GregorianCalendar.getInstance();
        calendar.setTime(date);
        calendar.add(unit, interval);
        return calendar.getTime();
    }

    public static String getFuture(String startDate, DateFormat format, int interval, int unit) {
        String future = "";
        try {
            Date date = format.parse(startDate);
            return format.format(getFuture(date, interval, unit));
        } catch (Exception e) {
        }
        return future;
    }

    /**
     * 用于返回指定日期格式的日期增加指定天数的日期
     *
     * @param date     指定日期
     * @param format   指定日期格式
     * @param interval 指定天数
     */
    public static String getFutureDay(String date, DateFormat format, int interval) {
        return getFuture(date, format, interval, Calendar.DATE);
    }

    /**
     * 以当前时间为基准增加指定天数的日期
     *
     * @param format   指定日期格式
     * @param interval 指定天数
     */
    public static String getFutureDay(DateFormat format, int interval) {
        return getFuture(currentDay(), format, interval, Calendar.DATE);
    }

    /**
     * 获取上个月的日期范围
     *
     * @param date
     * @return
     */
    public static String[] getLastMonthScope(String date) {
        String[] scope = new String[2];
        DateFormat format = new SimpleDateFormat("yyyy-MM");
        try {
            Date currentDate = format.parse(date);
            //获取前月的第一天
            Calendar cal_1 = Calendar.getInstance();//获取当前日期
            cal_1.setTime(currentDate);
            //cal_1.add(Calendar.MONTH, -1);
            cal_1.set(Calendar.DAY_OF_MONTH, 0);//设置为1号,当前日期既为本月第一天
            scope[1] = defaultFormat.format(cal_1.getTime());
            cal_1.set(Calendar.DAY_OF_MONTH, 1);//设置为1号,当前日期既为本月第一天
            scope[0] = defaultFormat.format(cal_1.getTime());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return scope;
    }
    /**
     * 获取上周的日期范围
     *
     * @param date
     * @return
     */
    public static String[] getLastWeekScope(String date) {
        date = getFutureDay(date, defaultFormat, -7);
        return getWeekScope(date);
    }
}
